package com.example.aopdemo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Random;

@Aspect
@Component
public class LogAspect {

    // 切点：匹配 OrderService 接口下的所有方法
    @Pointcut("execution(* com.example.aopdemo.service.OrderService.*(..))")
    public void orderServiceMethods() {}

    // 1. 前置增强
    @Before("orderServiceMethods()")
    public void beforeAdvice() {
        System.out.println("hello, 我是一个前置增强");
    }

    // 2. 后置增强 (add, delete)
    @AfterReturning("execution(* com.example.aopdemo.service.OrderService.add(..)) || execution(* com.example.aopdemo.service.OrderService.delete(..))")
    public void afterAdvice() {
        System.out.println("bye, 我是一个后置增强");
    }

    // 3. 获取返回值
    @AfterReturning(value = "orderServiceMethods()", returning = "result")
    public void afterReturningAdvice(Object result) {
        System.out.println("方法返回值: " + result);
    }

    // 4 & 5. 环绕增强（计算时间 + 权限校验）
    @Around("orderServiceMethods()")
    public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();

        // 权限校验 (仅 add 和 delete)
        String methodName = pjp.getSignature().getName();
        if (methodName.equals("add") || methodName.equals("delete")) {
            int auth = new Random().nextInt(2); // 0 有权限，1 无权限
            if (auth == 1) {
                System.out.println("权限校验失败，禁止执行 " + methodName + " 方法！");
                return null;
            } else {
                System.out.println("权限校验成功，可以执行 " + methodName + " 方法");
            }
        }

        // 执行目标方法
        Object result = pjp.proceed();

        long end = System.currentTimeMillis();
        System.out.println("方法 " + methodName + " 执行时间: " + (end - start) + " ms");

        return result;
    }
}
